package com.qf.serviceimpl;

import com.qf.dao.AccountDao;
import com.qf.entity.Account;
import com.qf.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * 事务转账
 */
@SuppressWarnings("all")
/**
 * @component: 类注解，将创建的类对象存放到容器中
 *      子注解：
 *      @Controller: 用于表现层
 *      @Service   ：用于业务层
 *      @Repository：用于持久层
 *
 * @Transactional :用于类上和方法上，作用范围不同
 * 用于事务注解，当开启AOP中的环绕的时候，无法回滚。
 * 如果两个同时使用就要将AOP环绕中的异常再次抛出
 *
 */
//@Component
@Repository("accountService")
@Transactional(propagation = Propagation.SUPPORTS,readOnly = true,rollbackFor = Exception.class)

public class AccountServiceImpl implements AccountService {
    /**
     * 自动注入
     *  @Autowired: 可以用在构造方法，setter方法， 属性(重点)， 方法参数
     *                 作用：自动注入所依赖的对象
     *                 特点：默认按照类型（byType）查找，如果知道多个，会按照属性名称查找对象
     *          相关注解：
     *             @Qualifier: 只能配合@Autowired使用， 指定对象的名称
     *             @Primary:类注解，作用提高对象的优先级
     *             @Resource: 可以用在类，setter方法， 属性(重点)
     *                 作用：自动注入所依赖的对象
     *                 特点：默认按照名称(byName)查找, 如果找不到，则根据类型查找对象
     *          对比：
     *             @Autowired: 默认byType，是spring提供
     *             @Resource: 默认byName， 是由jdk提供的
     *
     */
    @Autowired
    AccountDao accountDao ;

    public void setDao(AccountDao dao) {
        this.accountDao = dao;
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
    public void transfer(String fromName, String toName, double money) {

//        根据名字查询余额
        Account account = accountDao.selectByName(fromName);
        Account account1 = accountDao.selectByName(toName);

//        进行转账，修改
        account.setMoney(account.getMoney()-money);
        account1.setMoney(account1.getMoney()+money);

//        更新数据库
        accountDao.update(account);
        System.out.println(1/0);
        accountDao.update(account1);
    }
}
